﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections;
using System.Windows.Media;

using Civilisation_code.PJoueur;
using Civilisation_code.PCarte;
using Civilisation_code.PInterfaces_Fabrique_Unite;
using Civilisation_code.PPartie;
using Civilisation_code.PRessource;
using Civilisation_code.Implementation_Unite_EII;
using Civilisation_code.Implementation_Unite_INFO;

namespace Tests
{
    [TestClass]
    public class TestDeplacementUnite
    {
        
        [TestMethod]
        public void TestDeplacementSimple()
        {
            //Premier test : déplacement simple
            Monteur_Partie monteur = new Monteur_Partie_IMPL();
            
            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Assert.AreEqual(0, depart.Unites.Count);
            Assert.AreEqual(0, arrivee.Unites.Count);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEnseignant(depart, j1);

            Assert.AreEqual(1, depart.Unites.Count);
            Assert.AreEqual(0, arrivee.Unites.Count);

            depart.Unites[0].deplacer(arrivee);

            Assert.AreEqual(0, depart.Unites.Count);
            Assert.AreEqual(1, arrivee.Unites.Count);
        }

        [TestMethod]
        public void TestDeplacementMultiple()
        {
            //Premier test : on essaye de déplacer 3 fois une unités qui ne possède que 2 points de mouvement
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 11);

            Assert.AreEqual(0, depart.Unites.Count);
            Assert.AreEqual(0, arrivee.Unites.Count);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEtudiant(depart, j1);

            Assert.AreEqual(1, depart.Unites.Count);
            Assert.AreEqual(0, arrivee.Unites.Count);

            depart.Unites[0].deplacer(arrivee);

            Assert.AreEqual(0, depart.Unites.Count);
            Assert.AreEqual(1, arrivee.Unites.Count);

            //Second déplacement : devrait marcher
            arrivee.Unites[0].deplacer(depart);

            Assert.AreEqual(1, depart.Unites.Count);
            Assert.AreEqual(0, arrivee.Unites.Count);

            //Troisième déplacement : refusé
            depart.Unites[0].deplacer(arrivee);

            Assert.AreEqual(1, depart.Unites.Count);
            Assert.AreEqual(0, arrivee.Unites.Count);
        }


        [TestMethod]
        public void TestDeplacementTropLong()
        {
            //Premier test : on essaye de déplacer de 3 cases une unité qui ne possède que 2 points de mouvement
            Monteur_Partie monteur = new Monteur_Partie_IMPL();

            Hashtable joueurs = new Hashtable();
            joueurs.Add("Flo", new Tuple<string, Color>("INFO", Colors.Blue));
            joueurs.Add("Nico", new Tuple<string, Color>("INFO", Colors.Red));

            monteur.genererPartie(joueurs, false);

            Joueur j1 = monteur._partie._joueurs[0];

            Case depart = monteur._partie._carte.getCase(10, 10);
            Case arrivee = monteur._partie._carte.getCase(10, 13);

            Assert.AreEqual(0, depart.Unites.Count);
            Assert.AreEqual(0, arrivee.Unites.Count);

            Fabrique_Unite_INFO.FABRIQUE_UNITE.creerEtudiant(depart, j1);

            Assert.AreEqual(1, depart.Unites.Count);
            Assert.AreEqual(0, arrivee.Unites.Count);

            depart.Unites[0].deplacer(arrivee);

            Assert.AreEqual(1, depart.Unites.Count);
            Assert.AreEqual(0, arrivee.Unites.Count);

        }

    }
}
